package com.he.hsdyc.designmodule.single;

// 单例模式的懒汉实现1--线程不安全
class SingletonLazy1 {
    private static SingletonLazy1 singletonLazy;

    private SingletonLazy1() {

    }

    //第一种方式--------------线程不安全
//    public static SingletonLazy1 getInstance() {
//        if (null == singletonLazy) {
//            try {
//                // 模拟在创建对象之前做一些准备工作
//                Thread.sleep(1000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            singletonLazy = new SingletonLazy1();
//        }
//        return singletonLazy;
//    }



    //第二种方式--------------线程安全但是效率太低，是同步运行的
//    public static synchronized SingletonLazy1 getInstance() {
//        try {
//            if (null == singletonLazy) {
//                // 模拟在创建对象之前做一些准备工作
//                Thread.sleep(1000);
//                singletonLazy = new SingletonLazy1();
//            }
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        return singletonLazy;
//    }

    //第三种方式------------DCL双重检查锁机制
    public static SingletonLazy1 getInstance() {
        try {
            if (null == singletonLazy) {
                // 模拟在创建对象之前做一些准备工作
                Thread.sleep(1000);
                synchronized (SingletonLazy1.class) {
                    if(null == singletonLazy) {
                        singletonLazy = new SingletonLazy1();
                    }
                }
            }
        } catch (InterruptedException e) {
        }
        return singletonLazy;
    }
    //单例模式的懒汉实现--线程安全
    //通过设置同步代码块，使用DCL双检查锁机制
    //使用双检查锁机制成功的解决了单例模式的懒汉实现的线程不安全问题和效率问题
    //DCL 也是大多数多线程结合单例模式使用的解决方案
    //第一个if判断的作用：是为了提高程序的 效率，当SingletonLazy1对象被创建以后，再获取SingletonLazy1对象时就不用去验证同步代码块的锁及后面的代码，直接返回SingletonLazy1对象
    //第二个if判断的作用：是为了解决多线程下的安全性问题，也就是保证对象的唯一。



}
